import SparkMD5 from "spark-md5";
const DefualtChunkSize = 2 * 1024 * 1024;

/**
 * 计算文件的Hash值
 * @param fileChunks 文件的切片数组
 */
const calculateHash = async (fileChunks) => {
    return new Promise((resolve) => {
        const spark = new SparkMD5.ArrayBuffer()
        const chunks = []

        // 待计算 hash 的切片
        fileChunks.forEach((chunk, index) => {
            if (index === 0 || index === fileChunks.length - 1) {
                // 1. 第一个和最后一个切片的内容全部参与计算
                chunks.push(chunk)
            } else {
                // 2. 中间剩余的切片我们分别在前面、后面和中间取2个字节参与计算
                // 前面的2字节
                chunks.push(chunk.slice(0, 2))
                // 中间的2字节
                chunks.push(chunk.slice(DefualtChunkSize / 2, DefualtChunkSize / 2 + 2))
                // 后面的2字节
                chunks.push(chunk.slice(DefualtChunkSize - 2, DefualtChunkSize))
            }
        })

        // 借用浏览器的FileReader() API
        const reader = new FileReader()
        reader.readAsArrayBuffer(new Blob(chunks))
        reader.onload = (e) => {
            console.log('FileReader解析文件信息', e)
            // 计算Hash
            spark.append(e.target.result)
            // end()方法输出计算结果
            resolve(spark.end())
        }
    })
}

/**
* 文件切片处理
* @param file 
*/
const createFileChunks = (file) => {
    // 文件切片数组
    const fileChunkList = []
    // 当前已经切片的大小
    let cur = 0
    while (cur < file.size) {
        fileChunkList.push(file.slice(cur, cur + DefualtChunkSize))
        cur += DefualtChunkSize
    }
    return fileChunkList
}
onmessage = (e) => {
    const file = e.data;
    const fileChunks = createFileChunks(file);
    calculateHash(fileChunks).then(fileHash => {
        postMessage({
            fileHash,
            fileChunks
        })
    })

}

